#include <deque>

#include "cliente.h"
#include "filaEspera.h"


FilaEspera::FilaEspera(char tipo){
  fe_tipo = tipo;               ///Inicializa o tipo da estrategia da fila
  fe_fila = deque<Cliente*>();  ///Instancia um container (deque) para fe_fila
};

FilaEspera::~FilaEspera(){

};

char FilaEspera::tipo() const{
  return fe_tipo;
}

void FilaEspera::tipo(char tipo) {
  fe_tipo = tipo;
}

bool FilaEspera::vazia(){
  return fe_fila.empty();
}

int FilaEspera::tamanho(){
  return fe_fila.size();
}

/** Independente do tipo de estrategia da fila, o proximo cliente
   eh sempre o elemento da frente do container, pois o metodo
   void FilaEspera::insere(Cliente *f) ja eh responsavel por
   armazenar os cliente na ordem correta de atendimento */
Cliente* FilaEspera::proximo() {
  Cliente *cliente;
  cliente = fe_fila.front();
  fe_fila.pop_front();

  return cliente;
}

/** Insere o cliente no container, que eh um deque. Dependendo
   do tipo da estrategia da fila(FIFO ou LIFO), o cliente eh
   inserido no inicio quando a estrategia eh LIFO, ou eh
   inserido no final quando a estrategia eh FIFO */
void FilaEspera::insere(Cliente *cliente) {
  if(fe_tipo == 'f')
    fe_fila.push_back(cliente);

  else if(fe_tipo == 'l')
    fe_fila.push_front(cliente);
}

void FilaEspera::retornaFila(Cliente *cliente){
  if(fe_tipo == 'l')
    fe_fila.push_back(cliente);

  else if(fe_tipo == 'f')
    fe_fila.push_front(cliente);

}

void FilaEspera::apagaTudo(){
  fe_fila.clear();
}

